import json

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from django.http import JsonResponse
from book.models import BookInfo, HeroInfo
from book.modelserializers import HeroModelSerializer
from book.serializers import BookSerializer


class BooksView(GenericAPIView):
    """
        获取所有图书和保存图书
    """
    # 指定序列化器属性
    serializer_class = BookSerializer
    # 指定查询集属性
    queryset = BookInfo.objects.all()

    def get(self, request):
        # 1、查询图书表获取取所有图书信息 get_queryset 获取所有查询集数据
        books = self.get_queryset()
        # 2、返回图书信息 get_serializer获取初始化后的对象
        ser = self.get_serializer(books,many=True)
        # 2-2 data方法获取序列化后的结果
        return Response({'books': ser.data})

    def post(self, request):
        # 1、获取前端数据
        data=request.data
        # 2、验证数据 初始化序列化器对象，将前端需要验证的数据传递给data参数
        ser = self.get_serializer(data=data)
        # 2-2 执行验证方法
        ser.is_valid()
        # 2-3 获取验证后的状态信息
        if ser.errors:
            return JsonResponse({'errors': ser.errors})
        # 3、保存数据
        # 调用序列器中的create方法完成保存
        ser.save()
        # 4、返回结果
        return Response(ser.data)


class BookView(GenericAPIView):
    """
        获取单一图书
        更新
        删除
    """
    # 指定序列化器属性
    serializer_class = BookSerializer
    # 指定查询集属性
    queryset = BookInfo.objects.all()

    def get(self, request, pk):
        # 1、根据pk查询图书  get_object根据id值获取查询集中的一个对象
        book=self.get_object()
        # 2、返回图书信息
        ser = self.get_serializer(book)
        # 2-2 data方法获取序列化后的结果
        return Response({'books': ser.data})

    def put(self, request, pk):
        # 1、获取更新图书
        book = self.get_object()
        # 2、获取更新字段数据
        data=request.data
        # 3、验证数据
        ser = self.get_serializer(book,data=data)
        # 3-2 执行验证方法
        try:
            ser.is_valid(raise_exception=True)
        except Exception as e:
            return Response({'errors': e.detail})
        # 3-3 获取验证后的状态信息
        # if ser.errors:
        #     return JsonResponse({'errors': ser.errors})
        # 4、更新数据
        ser.save()
        # 5、返回结果
        return Response(ser.data)

    def delete(self, request, pk):
        # 1、获取删除对象
        book=self.get_object()
        # 2、逻辑删除
        book.is_delete = True
        book.save()
        return Response({})
